﻿#ifndef PILECOMPLEXES_H
#define PILECOMPLEXES_H
/**
 \file pilecomplexes.h
 \brief Pile des complexes
 \author Baptiste Pirault et  Hugo Dubois
 \date 01/06/2012
 \version 1
 **/

#include <QString>
#include <QSettings>
#include <iostream>

#include "exception.h"
#include "pileaffichage.h"
#include "pilestockage.h"
#include "fonctions.h"
#include "complexe.h"
#include "etat.h"

/*!
 \class pileComplexe
 \brief La classe gére la pile des complexes et des opérations à effectuer
 */
class pileComplexes : public pileStockage<complexe>
{
public:
	//! \brief Constructeur
	//!
	//! Initialise la constante MAX et MAX_DECIMAL. Affecte aux attribut PileAffichage et QTextEdit les valeurs de *p et *affichagePile.\n Appel de la fonction iniX pour initialiser les autres attributs
	//! Initialise la pile QStack (par héritage)
	//! \param *p : Pointeur sur la pile d'affichage
	//! \param *affichagePile : Pointeur sur QTextEdit. Affichage de l'interface	
    pileComplexes(PileAffichage *p,QTextEdit *affichagePile)
        :pileStockage<complexe>(p,affichagePile)
    {
        iniX();
    }
	
	//! \brief Ajoute au complexe X un nouveau caractère
	//!
	//! Construit le complexe avec le caractére donné en argument
	//! \param c : QString contenant le caractère (chiffre à rajouter)
    void addX(const QString c);
	
	//! \brief Réninitialise les variables
	//! 
	//! Réinitialise les variables :  im à false, dot à false, negatifRe à false, negatifIm à false, decimal à 0.1, precision à 0 et le complexe à (0,0)
    void iniX();

	//! \brief Accesseur du complexe X
	//! \return Retourne le complexe stocké dans l'attribut X
    complexe getX() const;
	
	//! \brief Retourne le complexe X en QString
	//!
	//! \return Retourne un QString contenant le complexe. Mis en forme pour l'affichage (avec le $)
    QString getQStringX()const;

    //! \brief Met à jour l'afficheur de la pile
	//!
	//! Affiche dans l'interface le contenu de la pile
    void updateAfficheur()const;

    //! \brief Retire le dernier caractère ajouté à X
    //!
    //! \warning Ne marche qu'avant la virgule
    void back();

    //! \brief Sauvegarde la pile dans le fichier mesOptions.ini
    void sauvegarder()const;

private:
	//! \brief Valeur Maximale du nombre de décimales
	//!	\def MAX_DECIMAL = 0.0000000000000001
    double MAX_DECIMAL;
	
	//! \brief Variable qui retient la position de la virgule
	//!
	//! La place de la virgule dans le réel s'el est décimal
    double decimal;
	
	//! \brief Stocke le nombre de chiffres du réel à afficher
    int precision;
	
	//! \brief Booléen pour la partie imaginaire
	//! 
	//! Vrai si partie imaginaire
    bool im;
	
	//! \brief Booléen pour la gestion de la virgule
	//!
	//! Vrai si après la virgule
    bool dot;

    //! \brief Booléen pour savoir si Re(x) est négatif
    bool negatifRe;

    //! \brief Booléen pour savoir si Im(x) est négatif
    bool negatifIm;
};

#endif // PILECOMPLEXES_H
